#ifndef MESSAGEDISPLAYAREA_H
#define MESSAGEDISPLAYAREA_H

#include <QScrollArea>
#include <QWidget>
#include <QLabel>

#include "model/data.h"

using model::Message;

// 消息显示区域
class MessageDisplayArea : public QScrollArea
{
    Q_OBJECT
public:
    MessageDisplayArea();

    void PushMessage(bool isLeft, const Message& msg);      // 尾插消息
    void PushFrontMessage(bool isLeft, const Message& msg); // 头插消息
    void Clear();                                           // 清空消息
    void ScrollToBottom();                                  // 滚动到底部

private:
    QWidget* container;
};


// 消息项目
// MessageItem 和 Message 不相同
class MessageItem : public QWidget
{
    Q_OBJECT
public:

    MessageItem(bool isLeft);

    // 工厂方法创建 MessageItem 实例
    static MessageItem* MakeMessageItem(bool isLeft, const Message& msg);

    // 工厂函数
    static QWidget* MakeTextMsgItem(bool isLeft, const QString& text);
    static QWidget* MakeImageMsgItem(bool isLeft, const QString& fileAddr, const QByteArray& content);
    static QWidget* MakeFileMsgItem(bool isLeft, const Message& msg);
    static QWidget* MakeSpeechMsgItem(bool isLeft, const Message& msg);

private:
    bool is_left; // 当前消息是否为左侧消息，即“对方”发送的消息
};


// 消息正文部分
// 文本消息 和 文件消息
class MessageContentLabel : public QWidget
{
    Q_OBJECT
public:
    MessageContentLabel(const QString& text, bool isLeft, const model::MessageType msgType,
                        const QString& fileAddr, const QByteArray& content);

    void paintEvent(QPaintEvent* event);

private:
    QLabel* label; // 消息正文使用 QLabel 表示
    bool is_left;
    model::MessageType msg_type;
    QString file_addr;
    QByteArray content;
    // 1. QByteArray 可以存储任何类型的字节数据，不受编码限制
    // 2. QByteArray 允许直接处理原始数据，适合需要高效处理大量数据的情况
    // 3. 与低级别 api 交互时，通常需要传递原始字节数据

};

#endif // MESSAGEDISPLAYAREA_H
